package model.player;

import model.Game;
import model.GameParameters;
import model.cardData.Card;
import model.cardData.CardSet;
import model.cardData.DiscardPileCardSet;
import model.cardData.StackCardSet;

public class Dealer {
	private Game game;
	private StackCardSet freshcards;
	private DiscardPileCardSet thrashcards;
	private CardSet tablecards;
	/**
	 * Konstruktor von StackCardSet erstellt einen Kartenstapel und mischt ihn.
	 */
	public Dealer(Game game) {
		freshcards = new StackCardSet();
		this.game = game;
	}
	/**
	 * Methode, die am Anfang die Karten an die Spieler verteilt.
	 * @param pl1 der erste spieler
	 * @param pl2 der erste spieler
	 */
	public void initialDeal(Player pl1, Player pl2) throws Exception{
		for(int i = 0;i < GameParameters.MAX_DOWNCARDS;i++) {
			try {
				pl1.giveDowncard(freshcards.pop());
				pl2.giveDowncard(freshcards.pop());
			}  catch(Exception e) {
				System.err.println(e.getMessage());
				throw new Exception("exception: Player cant recieve startingcards!",e);
			}
		}
		for(int i = 0;i < GameParameters.MAX_UPCARDS;i++) {
			try {
				pl1.giveUpcard(freshcards.pop());
				pl2.giveUpcard(freshcards.pop());
			}  catch(Exception e) {
				System.err.println(e.getMessage());
				throw new Exception("exception: Player cant recieve startingcards!",e);
			}
		}
		for(int i = 0;i < GameParameters.MAX_HANDCARDS;i++) {
			try {
				pl1.giveHandcard(freshcards.pop());
				pl2.giveHandcard(freshcards.pop());
			}  catch(Exception e) {
				System.err.println(e.getMessage());
				throw new Exception("exception: Player cant recieve startingcards!",e);
			}
		}
	}
	/**
	 * Methode, die Spielern Karten zum Nachziehen gibt/Verwaltet den Ziehstapel.
	 */
	public void drawsCard(Player pl) {
		try {
			pl.giveHandcard(freshcards.pop());
		} catch(Exception e) {
			System.err.println(e.getMessage());
		}
	}
	/**
	 * Der Spieler ruf diese Methode auf, der Dealer prüft, ob sie gelegt werden kann und entfernt
	 * die gespielte Karte dann aus der Hand des Spielers.
	 */
	public void playCard(Card card,Player pl) throws Exception{
		try {
			//TODO: Kartenregeln prüfen!
			tablecards.addCard(card);
			pl.removeHandcard(card);
			
			
			
			
		}  catch(Exception e) {
			System.err.println(e.getMessage());
			throw new Exception("Exception: Karte " + card + " darf nicht gespielt werden!");
		}
	}
	/**
	 * Gibt dem aktuellen Spieler alle Karten des Stapels 'tablecards'.
	 */
	private void letThemSwallow() {
		//TODO pl mit dem aktuellen Spieler austauschen!
			Player pl = new Player(this);
		
		int n = tablecards.numCards(); //TODO (optional) iterator einbauen?
		for (int i = 0;i < n;i++) {
			pl.swallow(tablecards.getCard(0));
			tablecards.remove(tablecards.getCard(0));
		}
	}
}
